From a quick look at the thread dumps, I think that the main problem is that JQSMonitoring (from Job/Queue/Slaves Monitoring Plugin) ends up loading builds in its constructor, which is
invoked during Jenkins startup because it is a RootAction, and the because extension loading is gated behind a instance-wide lock, this means that no other extensions can be loaded until JQSMonitoring is done loading builds.
I would try disabling jqs-monitoring to see if the issue goes away. I think the easiest way to fix the issue would be for jqs-monitoring to use an `@Initializer` method to do the work that is currently done inside of JQSMonitoring’s constructor so that it does not need to load builds while the extension-loading lock is held.
Some changes to the internals of Pipeline logging in the last two years or so might have made it so that Pipelines need to load extensions during startup where they did not do that previously, which could be why you are only seeing the problem after the upgrade.
One other thing I noticed from the thread dumps is that you are using Tomcat rather than the version of Jetty bundled in Jenkins, which is know to cause some weird behavior. I would consider using the bundled version of Jetty to run Jenkins instead.