Non c'è nessuno "migliore". Se si desidera massimizzare la portabilità, è possibile utilizzare solo tre valori: EXIT_SUCCESS, EXIT_FALURE e 0 (e 0 e EXIT_SUCCESS significano la stessa cosa). Se non ti dispiace perdere una certa portabilità, è spesso utile restituire vari altri valori per indicare il motivo per cui qualcosa non ha funzionato, o (in alcuni casi) restituire un valore diverso da zero anche in caso di successo per indicare cose come quante di X trovato, o porta il risultato di un calcolo, ecc.
Come tale, hai una scelta tra portabilità (ma principalmente a sistemi che probabilmente non ti interessano, principalmente VMS) e funzionalità su un insieme leggermente ridotto di sistemi. Devi decidere quale è più importante per te.
Modifica: No, EXIT_SUCCESS non è sempre uguale a zero - ma (almeno per quanto riguarda le cure standard) i due significano la stessa cosa. C'era almeno un compilatore su VMS, tuttavia, che definiva EXIT_SUCCESS su un valore diverso da zero (VMS normalmente interpretava i numeri pari come errori e numeri dispari come successo, quindi EXIT_SUCCESS era definito al numero dispari corretto e 0 era trattato in modo speciale, quindi il sistema ha ottenuto un numero dispari quando / se lo hai restituito).