Can’t you just partition the table by time (or whatever) and drop old partitions and not worry about vacuuming? Why do you need to keep around completed jobs forever?
Your temporal partition idea is spot on. But instead of dropping old partitions, you can instead archive them.