You are forgetting that reading stdin is asynchronous. Thus whatever function reads from stdin cannot synchronously return a value and must call process.exit to set the return code. With the current architecture, reading stdin anywhere outside of bin/eslint.js would break the world.

It's up to you, but pushing stdin reading into cli.js would require a fairly large restructuring of a lot of code, especially the tests, which expect a return value from cli.execute. I would rather not go there.