execl segue o caminho do comando a ser executado, seguido pelo argumentos;
The first argument, by convention, should point to the filename associated with the file being executed.
é por isso que o primeiro argumento é "vi" .
Você pode pensar nisso como especificando, por um lado, o caminho do comando e, separadamente, o array argv que o programa recebe (estou simplificando um pouco aqui). Cabe ao autor da chamada especificar o que o argv[0] do destinatário irá conter.
Os programas podem usar argv[0] para ajustar seu comportamento; Como você viu, o Vim se comporta como o Vi se for invocado como vi . Outro exemplo é busybox , que implementa uma ampla variedade de comandos em um único binário.