I like Daemon::Control a lot. If you were using it, none of the above code would be needed (i.e. it takes care of start/stop/status, pid files, init scripts etc). I've even used it to daemonise Java and Python programs.
Most of the OP code is not necessary with Proc::Daemon either. I see very little difference between the utility, options, and syntactic verbosity of the two packages; only the init stuff seems an exception.