Does he depreciate atexit(3)? In my experience atexit is a sane solution to some problems, and _exit(2) is useful when you do *not* want the C library clean up and whatever other activity might be implied by exit(3), for example when exec*(2) fails in a child process.
If you want to exit normally, even in an emergency, then you *should* be using exit(3) and not _exit(2) or abort(3). In the event of an assertion failure then clean up code could be destructive, and therefore should be avoided, but programs should not fail assertions.
IMHO a good program should handle all errors, including malloc failure, in a sane manner. It really is less painful that people that refuse to do it think. If you do *not* use a library then removing linked lists when something goes wrong is trivial.