Heap and stack exists and are widely used, but they are presented here as the only memory allocation strategies.
Static memory allocation is widely used in the embedded world.
And custom memory allocators are very often used in the gamedev world, quite often arenas, with allocations grouped by lifetime (like a frame or a level) and destroyed all at once. But there are many other approaches, more or less advanced and with different tradeoffs.
Memory management is not difficult but it is also not exactly entry-level, the problem we have is that many beginners are told that manual memory management is just outdated and unnecessary, while the cost of using "managed" solutions, quite often involving an annoying and intrusive garbage collector, and even worse, small allocations scattered all over the place for no reasons are very tangible.