A flag decouples deploying from releasing, which is genuinely valuable, and it also doubles the number of code paths that exist — permanently, unless somebody deletes it.
if (Feature::enabled('new_checkout', $user)) {
return $this->newCheckout($request);
}
return $this->legacyCheckout($request);
// the part that is not code: a ticket, created with the flag,
// due date set, to delete the flag and the losing branch.
Two flags interacting is four paths and nobody has tested all four, which is why a codebase with forty long-lived flags has a combinatorial space no test suite covers. Creating the removal ticket at the same time as the flag is the only mechanism I have seen work; a monthly review of flag age is the backstop. A flag that has been at one hundred percent for three months is dead code with a configuration entry.