The GNU page for Eshell says that
Eshell is not a replacement for system shells such as bash or zsh. Use Eshell when you want to move text between Emacs and external processes; if you only want to pipe output from one external process to another (and then another, and so on), use a system shell, because Emacs's IO system is buffer oriented, not stream oriented, and is very inefficient at such tasks. If you want to write shell scripts in Eshell, don't; either write an elisp library or use a system shell.
This makes it sound as if this IO system being buffer oriented was unique to Eshell. I'm new to Emacs and still trying to wrap my head around what the various shell modes do (and what the differences between them are), but unless I'm quite mistaken, M-x shell, ansi-term, multi-term, etc. all use this form of buffer oriented IO too, correct? So this criticism isn't something unique to Eshell -- it is a valid criticism for running shells in Emacs in general?
In other words, zsh, say, in Emacs (through M-x shell or multi-term) would not inherently be superior to Eshell due to this consideration?
If this is the case, then I suppose if one wants to "main" Eshell it is a good idea to keep a real terminal emulator running for big compile commands, using cat
on files that might end up being super long, and other things that are stream oriented. Is this what people who us Eshell/M-x shell almost exclusively do to avoid hanging Emacs with lots of output?