Still not definitive, but here's some more data:
Baseline, flying around with no slowdown, I see:
54% of time is in com.fs.starfarer.campaign.CampaignEngine.advance()
35% of time is in org.lwjgl.opengl.Display.update()
7.5% of time is in com.fs.starfarer.campaign.CampaignState.render()
With slowdown, the breakdown is instead:
54% CampaignEngine.advance()
25% Display.update()
14% CampaignState.render()
Hm. Looks like there's something suspicious under CampaignState.render(). Let's break that down another level.
Baseline, no slowdown:
com.fs.starfarer.campaign.CampaignEngine.render(): 3.2%
com.fs.starfarer.ui.interface.render: 3%
and a few other smaller things make it all round up to 7.5% total for CampaignState.render.
With slowdown:
com.fs.starfarer.ui.interface.render: 8.6%
...Okay, so it looks like whatever the problem is, it's something to do with UI rendering? (Trying to track the stack traces down further did not, unfortunately, yield any further information or any sort of obvious smoking gun.)
This was, again, a slowdown triggered after end of battle. Though, with your comment on invisible tooltips hanging around, I'm wondering if there's a way for such a thing to be generated by an end-of-battle collection screen or something? Looks like I may need to do memory sampling in addition to CPU sampling... but not tonight. This morning? Whichever; I need to get some sleep.