...a real bad code smell.I agree. A previous 'refactoring' had each 'main runmode' take the second element of path_info and run it through a dispatch table. I just had the feeling that I could let C::A handle that too.
My last effort was, as you say, to separate out the main runmodes as separate C::A apps each with its own instance script. I have a Base.pm that inits everything thats needed and all common code is in its own module. So perhaps the separate apps idea is the way to go.