As I have written a full-fledged, preemptive multitasking kernel myself, without using dynamic memory management at all, I'd say you don't need it per sé.
If you have multiple dynamic operations going on (like communication protocols and the like), you may very well need more memory in total, since you need to pre-allocate the worst-case memory needs for every operation separately, whereas dynamic allocation lets you spread the load.
And of course, you gain flexibility when using dynamic allocation: Assuming that you consistently check for unsuccessful allocations, you could implement a strategy to limit the use of dynamism in the case of high memory load, whereas expanding your buffers/cache/... when memory is plentiful. That's something you cannot do with pre-allocation.
It's an architectural decision, for which it is good to know the alternatives and their respective consequences on the basis of your environment.
I've always taken the stance that, given a sound design, strict error control and a set of decent tools, dynamic memory is not a big problem. Encapsulation helps, be it in C functions or in C++ classes.
FWIW,
Johan