Feature flags solve a real problem: decoupling deploy from release, so a change can sit in production, dark, until someone decides it's ready for users. That's a genuine improvement over "merge to main and pray." The part that gets skipped in the pitch is what happens to the flag after the feature ships.
The flag that never got a removal date
A flag is created with a clear purpose and, implicitly, a clear expiration: once the feature is fully rolled out and stable, the flag and the old code path it guards should both disappear. In practice, that removal step competes for priority against everything else on the backlog, and it usually loses — the feature works, the ticket is closed, and the flag quietly becomes permanent. Nobody decided that on purpose. It's just what happens when "remove the flag" isn't anyone's job in particular.
The cost isn't the flag, it's the combinations
One flag is a single if. The actual cost shows up as more of them accumulate: every additional flag doubles the number of code paths a change could theoretically hit, and almost nobody tests all the combinations. A bug that only reproduces with flag A on and flag B off is a bug that's functionally invisible until a specific customer with that specific combination hits it in production — and by then, the engineer who wrote either flag may not even remember they interact.
Treat a flag like a loan, not a purchase
The teams that keep this under control tend to do one unglamorous thing: they attach an expected removal point to the flag when it's created, not after. That can be a date, a rollout percentage threshold, or a linked ticket that's part of the same body of work as the feature itself — not a "someday" cleanup task. A flag with no owner and no expiration isn't a safety net anymore; it's a second, hidden version of your codebase that nobody signed up to maintain.
The takeaway
A feature flag is debt with an interest rate — every extra day it lives past its useful purpose is another day someone has to hold two code paths in their head to reason about the system correctly. The flag isn't the risky part. Forgetting it exists is.