A program is essentially data structures and their manipulations using appropriate algorithms. Data must be stored somewhere in memory. It can be either on the global stack or on the heap of memory.
Just because the heap is not used does not guarantee that the global or stack will not be corrupted by bad code.
If the system is well designed, then to fulfill the required function, it must have all the necessary resources, that is, processor, memory, os, bandwidth, power, cooling, etc.
It can be implemented by managing global memory instead of heap memory, but this will make many libraries that use pointers useless.
I believe that the best approach is to keep it simple, to get a lot of dynamic visibility in the system at startup / debugging, and to make sure that unit tests, code coverage tests, and tests at the system boundary are performed carefully before declaring them suitable for deployment.
If he is well designed, well designed, and well tested, he should do everything well, what he should do, and not do what he should not do.
There are compiled languages that do not have pointers, for example. Fortran, but I don’t know any embedded systems that use Fortran exclusively to implement the system.