Good, that is exactly the split worth testing, and so far I have only run the background half.
My guess is the killed state is worse than I described. A suspended app still has a process that can answer the relay, a killed one has nothing iOS will wake for an NWC request, because there is no push channel for it. So the invoice request sits on the relay until I open the wallet, and by then Primal has usually stopped waiting. The zap does not arrive late, it simply never happens. That would also explain why the background case looked almost-working to me while everyone insists it is broken.
I will test it properly this week: kill the wallet, zap, wait, reopen. If it lands the way I expect, I will send you the steps and the timings, so it is a clean reproduce instead of a hunch.
And the fix I would actually want as a user: let the wallet hold the pending invoice and pay it the next time it wakes up. That removes the need for any iOS background service at all.