Semplicemente perché come l'hai implementato, non è corretto. Quando ci sono più attributi su cui basare la comparazione, la logica va fatta "in cascata", cioè continui con i confronti solo se hai uguaglianza. Alla prima disuguaglianza, hai già il risultato finale e non devi andare oltre.
Con compareTo confronti i due nomi. Se il risultato è diverso da zero, hai già il risultato.
Altrimenti se è zero, con compareTo confronti i due cognomi. Se il risultato è diverso da zero, hai già il risultato.
Altrimenti se è zero, confronti le due età (e nota che in Java 7 Integer ha il public static int compare(int x, int y)
È più semplice e lineare di quello che hai fatto.