The code has issues. It can be a headache to read, a nightmare to understand, and a PITA to modify. It can be impossible to write useful tests for, may be riddled with defects and bugs, have security vulnerabilities, and performance issues. More than this, the way the code was written makes it difficult to add new functionality. Ultimately, the code is negatively impacting (existing and future) value while posing a risk for added costs (inefficiency and turnover, for starters).
It’s useful to remember that software has an average lifespan of 7 years, but that can extend to 12+ years if it has over a million lines of code. Concurrently, software developers tend to change jobs every 1.5 to 2 years. A given software project may see 3 to 6 complete rotations. Each new member to the team may require 3 or more months to get up to full speed with the code. Developer skill, team structure, and skipping requirements to meet deadlines all contribute to technical debt.
A lot of other things can change over time, too – new operating systems, devices, third-party APIs, use of programming languages, emergence of new technologies, software regulations (like GDPR), and of course, the competition. These are examples of inevitable technical debt.