Quick answer
The clearest signs are: developers avoiding parts of the codebase out of fear, running on a .NET Framework version nearing end of support, rising hosting costs with flat performance, slow onboarding for new developers, and leadership requesting AI features the current architecture can't safely support. A low-risk fix is incremental (strangler-fig) migration, not a full rewrite.
Most legacy .NET Framework systems don't fail loudly. They fail slowly — a deployment that takes longer every quarter, a developer who quietly becomes the only person who understands a module, a security patch that keeps getting pushed to "next sprint." By the time the failure is obvious, the fix is expensive and disruptive. Here are five signs worth taking seriously before that happens.
1. Your team is afraid to touch certain parts of the codebase
If there's a module nobody wants to open — because nobody fully understands it, tests don't cover it, or the last person who touched it broke production — that's not a personality problem, it's an architecture problem. Fear-driven development is one of the clearest signals that a system has outgrown its original design.
2. You're running on a .NET Framework version approaching end of support
.NET Framework 4.8 is the final version in that line — there is no 4.9. It will continue to ship with Windows, but new platform investment, performance work, and tooling are all going into modern .NET (8/9/10) instead. Every year on the old framework is a year further from current security tooling, cloud-native hosting options, and the developer talent pool that increasingly expects modern .NET.
3. Hosting costs keep climbing but performance doesn't improve
Old WebForms and early MVC applications are frequently tied to full IIS servers with Windows licensing, vertical scaling, and manual failover — all of which cost more, and scale worse, than a modern containerized or PaaS deployment. If your infrastructure bill keeps growing while user experience stays flat, the framework is often the bottleneck, not the traffic.
4. Onboarding a new developer takes weeks, not days
A healthy codebase lets a competent new hire ship a small, safe change in their first week. If onboarding involves a long list of tribal-knowledge caveats ("don't touch that config, it breaks the batch job"), the system's complexity has outpaced its documentation and structure — a strong early indicator that maintenance costs will keep rising.
5. Leadership is asking for AI features you can't safely add
This is increasingly the trigger we see first-hand: a business wants an AI agent or copilot added to a core system, and the legacy architecture simply has no clean way to expose the right data or hooks without a risky, ad-hoc integration. Modern .NET's built-in support for containers, minimal APIs, and orchestration frameworks like Semantic Kernel makes this dramatically easier — but only once the underlying system is on a supportable foundation.
What a low-risk modernization path actually looks like
The instinct is often "rewrite it all," which is exactly how modernization projects stall for years. A better path is incremental: identify the highest-risk or highest-value module, wrap it behind a clean interface, migrate that one piece to modern .NET, and repeat — a pattern often called the strangler-fig approach. It keeps the system shippable throughout, instead of freezing feature work for a year.
If any of these five signs sound familiar, it's usually cheaper to start the conversation now than after an outage forces it. See our Legacy .NET Modernization service for how we approach this incrementally.
Grab our free AI & Legacy Modernization Readiness Checklist — a 25-point self-assessment covering codebase, data, security, and business case.