Wow Michael you are absolutely right. Turning jit off results in a query execution about twice as fast as pg11. That is a huge relief. I will read the jit related docs and see if there is anything smarter I should be doing other than disabling jit entirely, but it works a treat for this query.
Does anyone have a theory of why pg15 should behave so differently to pg11 here? Better still, any suggestions for configuration that might make pg15 behave more like pg10. I am really dreading the prospect of stepping our many live implementations back to pg11 :-(.
One major factor here appears to be JIT compilation, which is off by default in pg11, but on by default in pg12+.
You can see at the bottom of your slowest query plan that about 233s of the 240s are JIT related.