With C in the embedded world it is very common to write entire applications that never only use static memory and the stack. Sometime programmers will allow dynamic memory during init only, other times not even then (I tend to favour the never approach, as I can verify that malloc is never called anywhere).
It's very common that both historical artifacts and natural wonders have been consumed by reservoirs, I suspect it would be almost impossible to avoid this.
For the codebase I was working on today (in C). At first it was just } so filtered those out, then it was /* (no comment detail on that line) so again filter them. Then it was a bunch of #includes.
Not surprising but not insightful at all unfortunately
FPGA's also have billions of transistors now, but adding more block memory means removing transistors from something else, such as LUT's, registers, DSP blocks etc.
As always it is a tradeoff, and given many designs don't need much block memory, or need so much memory that external memory is a better choice anyway.
https://www.youtube.com/watch?v=HG6c4Kwbv4I