A full rewrite assumes you can specify the old system's behavior precisely. You usually cannot: the documentation is stale, the original authors are gone, and the code carries years of implicit contracts nobody wrote down. Martin Fowler's account of the strangler fig approach puts it directly: "Replacements seem easy to specify, but often it's hard to figure out the details of existing behavior," and much of that behavior is unwanted anyway, so rebuilding it is wasted work (Martin Fowler).
The alternative is gradual replacement: build new code alongside the old, move behavior across one piece at a time, and keep the system running throughout. Microsoft's architecture guidance describes the mechanics as a facade or proxy that intercepts requests to the legacy backend and routes them either to the old application or to new services, shifting more traffic to the new side as each iteration completes (Microsoft Learn). Wikipedia's entry on the pattern notes the same structure can run at method or class level, not just at service boundaries, so you do not need a network hop to start (Wikipedia).
The cost you accept is transitional architecture: adapter code, dual reads, comparison logging, all of which goes away when the migration finishes. Fowler argues the reduced risk and earlier value outweigh that cost, because each slice delivers working behavior instead of waiting for a big-bang cutover (Martin Fowler).
One more argument for wrapping: partial progress is still progress. In branch by abstraction, the main branch stays deployable at every commit, so a migration can be paused when a higher-priority feature lands and resumed later without a merge nightmare (Harness).



