If the alternative is something like a handle-based or smart pointer system, then you'll reap the benefits in terms of ease of debugging on a daily basis.
Edit: as aaronblohowiak writes, this method is commonly known as a http://en.wikipedia.org/wiki/Region-based_memory_management
Doesn't Erlang do something like this with processes?
What about doing scratch heaps for data with limited lifetime? Especially if you have a way of somehow reasonably predicting how much heap you're likely going to need (perhaps a heuristics obtained with a bit of machine learning?). Allocate a bit more to give yourself some headroom, use a dumb allocator, and if you run out of space, allocate an emergency area. Obviously, in most cases you won't have to do that, though. (If you're obsessed about speed, you can allocate just blindly and use a memory fault handler to detect that you've run out of space. :-) CLISP does that and it seems to work. Look at GNU libsigsegv.)
Ken Thompson's C compiler does this.
http://plan9.bell-labs.com/sources/plan9/sys/src/cmd/cc/comp...
http://plan9.bell-labs.com/sources/plan9/sys/src/cmd/cc/lex.... (near the end)
http://plan9.bell-labs.com/sources/plan9/sys/src/cmd/cc/macb... (near the end)
Would be interesting to know if a simple bitsshift hash table is faster for a compiler usecase anyway?