Yes, it can run doom: https://github.com/xoreaxeaxeax/movfuscator/tree/master/vali...
It just doesn't run doom terribly fast.
Malloc isn't particularly more special than any libc function. It simply supports the fantasy that the memory is unlimited in scale. It was always of a static size, you were just handing off the chore of dividing it up. You can usefully implement dynamic sizing in languages with static memory allocation by pre-allocating large arrays and then maintaining handles and liveness flags. This is, in fact, how every console game used to do it until available memory sizes got into the hundreds of megabytes. Fragmentation and the subsequent crashes from OOM presented too much of a concern before then.
To be fair, z/OS is technically a Unix these days.
They already did, but seem to have a pathological aversion to actually publicizing it:
https://www-01.ibm.com/events/wwe/ast/mtm/audit.nsf/enrollal...
These two things disallow entire classes of exploits and errors.
Edit to add, rather than put out these puff pieces, ibm needs to figure out how to get mainframe access for developers, only then will they see usage increase.