Top tip: Don't use signals in the parent to catch SIGCHLD (as demonstrated in The Perl Cookbook) otherwise you'll miss some of your children dieing, just use wait. Set in non-blocking if you must but you want to try to do the absolute minimum in the parent so it is always alive to spawn more children.
Actually the way we wrote the code is to use a combination of SIGCHLD and also waitpid so not to miss any children dieing. But your concern over the code concerns me, why do you say not to use SIGCHLD like the The Perl Cookbook
does? We haven't run this script yet for a long period of time because there's still some things that need to be done, but so far it seems to be pretty good at cleaning things up, at least children-wise.