就 lands the action right behind a preceding trigger — sooner than expected. 早就 has no trigger; it shoves the completion far back down the timeline — long since, already done before you raise it.
Bare V了 reports the action finished, neutral on when. 早就…了 marks it finished much earlier than the listener assumes, pushing against their fresh framing.
他聽過這個故事了。 (neutral completion, no time gap) → 他早就聽過這個故事了。 (heard it long ago, far earlier than you'd think)
早就他聽過了。 (早就 fronted before the subject) → 他早就聽過了。 (早就 sits before the verb)
他早就聽過。 (open, no seal) → 他早就聽過了。 (了 closes it and carries it to now)
English 'already' floats and can stand alone; 早就 is fixed before the verb and leans on a clause-final 了 to seal the result, never dropped at the end by itself.