Good point. I wonder if there was some criteria that determined if a utility were to be a command or a builtin, originally. I thought a shell first and foremost was about working with processes, and a little less about working with files. But both are obviously needed, one way or another, so will be interesting to see what becomes of this.
Based on list seems builtin functionality is what is used to work with processes (nohup, kill, etc), environment (where, which, etc), and for shell as programming language ([, while, etc).
Yes. As an example, the source builtin would not be possible to implement as a command as a child process can't change its parent's environment. So those types of concerns play in I think.