Sobre exceptions (EX) vs. error as values (EAV). Acho que recentemente EAVs têm ganhado mais adoção por ter melhor "type-safety" na IDE. Isso é realmente muito bom.
Exceptions de fato têm um overhead maior (um tema comum em linguagens de programação). <...>
No V8 moderno, muitas dessas questões não são mais preocupações reais.
No caso de usar error as value ainda mais. Há momentos que faz sentido usar como erros esperados de fluxo, validações e etc. Agora imagine uma query que busque por um item que não existe, ou melhor, que o usuário não tenha permissão de acessar, deveria ser uma exception com status code adequado. Seu sistema não perderá performance por conta disso.
No final, “deveria” não é regra absoluta. No desenvolvimento, tudo precisa ser levado em consideração. Desde as necessidades do sistema até preferências e crenças dos desenvolvedores, que no final, moldam as regras.
Via de regra, não pense excessivamente em performance prematuramente.