Non funziona perchè span è un elemento inline, ed ha come valore di larghezza quella del testo che contiene. Allineare il testo interno ad uno span non ha alcun risultato a video, perchè la larghezza su cui si lavora è la larghezza del testo stesso.
Un div invece è un elemento di blocco, quindi, se non diversamente specificata, assume come larghezza la massima possibile rispetto al suo contenitore. E qui l'allineamento risulta visibile, visto che lo spazio a disposizione è maggiore di quello occupato dal testo.