"Once restored, it is wise to run ANALYZE on each restored table so the optimizer has useful statistics; see Section 24.1.3 and Section 24.1.6 for more information."
So is there some other step in the process that occurs after the restore and before you run your function?
There are several other restore called and a delete query that clears out an unrelated table.
However, I think this solves the issue for us and the mystery. The ANALYZE was missing which reduces an unending query down to a minute. The ANALZYE runs very quickly on its own so we're simply going to fix the issue by following documented advice.
I guess the length of the query when before/during the ANALZYE felt like something more was wrong.