That's how I ended up doing things too, i.e. explicitly code destructors for custom types, and call them in zone_cleanup from the zone they are allocated in.
With stack allocated objects, can you not just explicitly free resources in the function itself? The reason I wanted to have a zone_cleanup was that there didn't seem to be any other way of freeing file resources etc allocated inside a closure when that closure was recompiled (which automatically free's the closure's top zone, but otherwise leaves any other resources hanging without handles to close/free/squelch). But I can't think of a circumstance where you would need to do this for something allocated on the stack.
+1 for your question on mzone. I often get that "cannot find symbol hcopy..." error, and not sure why. Actually, a great addition to the documentation would be expanding the memory management explanation with some API references for the memory management functions. Off the top of my head I think there are alloc, salloc, zalloc, halloc, memzone which are covered in the existing docs, but also let, lets, letz, leth, and then a bunch of memzone management functions for pushing and popping the zone stack, destroying zones etc, whose names I can't remember. Does memzone return a handle to the new zone, which can be passed into these functions? I'm happy to update the docs if someone can point me to the appropriate functions. I've been thinking for a while of some way to visualise what zone a symbol is pointing to, to try to reign in the segfault bonanzas I often have.