This is definitely the ideal situation, but as you said most companies do not have the resources to greenfield a separate project. Additionally convincing the higher-ups that its worth it is a difficult task.
> Another good way is to rewrite piece-wise, in place (refactoring). There are lots of different ways to do this regardless of architecture, ultimately you're essentially creating a bubble of new code that grows and grows until it completely replaces all the old code.
> Work component-wise in an "add + deprecate" fashion.
Everywhere that I have worked this has been the route we've taken. We isolated the old behavior until we were able to fully ween clients off the product (or perform a data conversion and completely use the new code).