Что-то не полностью пояснили выше, а мне лень было. Я вот такой старый, что помню, что в древнем си void был макроподстановкой int. По сути void - пусто, то бишь мол ничего не возвращает, но по факту return 0; — возврат нуля. Почему же нуля, если это типа FALSE как бы (как бы, так как были времена, что и bool типа не было), а потому, что если все хорошо, то достаточно этого, а вот когда плохо, то надо кучу разных значений иметь и хорошо подходит все остальное. Если сейчас все привыкли, что int 32 битный, то были времена когда он даже был не 16 битный, так что int может быть непредсказуемой длины, хоть в 10 бит, смотря какое железо будет.
Если же вы хотите знать как сейчас, то видно надо новые стандарты брать и читать там, какой в это сейчас вкладывают смысл.
Но всегда было так, что программа возвратить должна результат, который мы можем использовать еще где-то или передать другой программе.