Acho que as exceções viraram um problem em linguagens sem checked exception como C++ e C# por que os programadores esquecem frequentemente de tratar elas. Então esses mecanismos de retorno de erro facilitam para lembrar para sempre tratar erros. Particulamente, acredito que retorno de erro melhora a leitura código, já que evita aqueles blocos try { } catch {} gigantescos.

Mas o mais importante é: nunca ignore erros e sempre verifique se os argumentos passados para os procedimentos são válidos, o sistema nunca pode ficar em um estado inválido. Mesmo que o código fique verboroso, seja usando exceções ou com retorno de erro.