Modernizing legacy .NET without a rewrite
A rewrite is usually the riskiest option on the table, and it is usually the first one proposed. It freezes feature delivery, re-implements years of edge cases from memory, and asks the business to trust a single big cutover.
Strangle, don't replace
I wrap the legacy system and route new functionality through a modern .NET layer. Each new capability ships on the current stack; the old code keeps running untouched until a given piece is ready to move. Over time the modern surface grows and the legacy core shrinks, with no day where the business is down.
Run both, compare, then cut over
For anything risky, a fee calculation or an invoice run or a migration, I run the new implementation next to the old one and compare the output on real data before switching. Differences are bugs you find in private instead of in production.
You can't modernize what you don't understand
VB.NET WebForms, Visual WebGui, EDMX, classic Web API: understanding exactly how the old system behaves is what makes the new one safe. Modernization isn't a fresh start; it's a careful handover.