It sounds like I have my permissions set wrong and that perhaps archive::zip is less forgiving than apache. I'll try opening my permissions and owner to something totally public all along that path and see what happens.
Well, you're getting *very* close. Archive::Zip has nothing to do with permissions directly. I'm almost postive that what you're missing is that apache runs on one user account, that quite likely has slightly different permissions than your login user account.
When you execute a CGI manually, you're running as *you*. Meanwhile, when one is called via the Apache daemon, it's running as (apache|httpd|etc.).