For a few years, I've been programming with hierarchical allocators, temp memory, arenas, and all of that. Much like Casey, I can get away without dynamic arrays just fine. I just use fixed-sized arrays or bucket lists and b+trees. If things need to get freed and reused, I use free lists. However, sometimes it's really convenient to at least use a bucket array, where the only part that uses exponential growth (array doubling) is the array of bucket pointers.
The rub is that once you have array doubling in your program, you start to want to lean on a general-purpose heap allocator and use dynamic arrays everywhere (like Jon). This is because free-listing becomes a much harder and more general problem.
Does anyone here use dynamic arrays effectively with some favorite heap implementation that can be used on top of basic, stack-like arena allocation?