Your technique matches the method I've seen used in the past. Clone it, upgrade the clone to latest plugins, verify it still works, upgrade core to latest Jenkins, verify it still works, upgrade plugins to latest plugins, verify it still works, repeat until successful, then schedule downtime for the production instance, do the same steps with the production instance.
If the history of jobs inside your running version is not critical to you, you could try making this your time to switch to Docker. That transition will be much more work than the upgrade path you described, but it will make future upgrades easier and will make it easier to construct sandbox versions of your Jenkins server.
A basic example of that technique is in https;//
github.com/MarkEWaite/docker-lfs/ in the lts-with-plugins branch. I keep a much more involved version of that technique in a private docker repository (since it includes sensitive information).
Mark Waite