We have a similar challenge right now. I believe you're right to keep maintenance work located with the code owner, for reasons of responsibility (reducing moral hazard). Here are the ways we're attempting to confront/solve it:
- Allocate time for refactoring and redesign to minimise the longer-term burden of support work
- Develop the products in new directions which will generate more revenue - and which give us the opportunity to merge maintenance work into new development work
- Ensure the maintenance service is sufficiently compensated by clients to make it worth spending time on (this may not apply if you're an internal team rather than a consultancy)
- Make sure everyone has enough new stuff to keep them interested
All these approaches together make it workable. But as I think I heard someone say once, there's no silver bullet.
Perhaps the best single thing you can do is to try to remove the distinction between maintenance and new development. Every action of a software developer starts with some existing body of technology, and ends up with a better one. "Better" can mean more powerful, new features, better designed, one less bug - whatever.
Sometimes the existing body of technology is your IDE and the standard Java APIs, and "better" means that you end up with a new CRM application. Sometimes the existing technology is an intricate corporate application and "better" means that the payroll run works accurately without manual checks.
As long as "better" brings benefits to enough people to pay for the effort it took to get there, you have a sustainable process.