In consulting we don't do upgrades, we come, we deliver, and we leave, with maintenance contracts for existing deployed versions.

For an upgrade someone has to pay for it anyway, so whatever pains there are, they are reflected on project budget anyway.

More devs should do the math of work hours to money.

This really highlights one of the main differences between "product" and "project" centric work. With a project, it's the client's problem ($$$.) Usually they'll balk at the dollars and effort required and accept the risks. Even with an outdated, obsolete framework, the actual risks are often minimal. "It's still working, right?"