The problem is that you're building a new system to completely replace an existing system, and the existing system is tightly integrated in a way that makes piecemeal change difficult to impossible. And the new system isn't just a refactoring for bad code - it's a redesign in the name of new functionality.
In this particular case, it was a banking system that worked largely by nightly batch jobs. Data queued up during the day was processed at night. Job A triggers Job B, which Triggers Job C; etc. What we wanted was to change those batched transactions into individual transactions that could be processed in synchronous quasi-realtime.
With reconciliation happening near the end of the batch processing, how do you do that?
And mind you, this system moved more money every day than the GDP of many countries. Failure was NOT an option. Not if you don't want to roast the entire US economy. So the consequences of error were truly terrifying.