I was aware this behavior exists for RerunOnFailure. The rationale in that case:
If the pod were to be deleted in this case, then virt-controller has no way of being able to distinguish between "the guest was intentionally shut down" and "the guest crashed" -- those need to be treated differently for that RunStrategy. Hence the pod is kept perpetually in the case of graceful shutdown -- in order to prevent a new virt-launcher pod from being immediately created.
I just did a code dive into the virt-controller code responsible for this and what you observed is indeed the case. The only time the pod is deleted or created is if an API call explicitly requests it. State changes initiated from within the VMI (e.g. request the OS to shut down) don't cause changes to the pod.
I'd have to think on it to decide if this is expected / intentional--or just an oversight. As I alluded above, if it is something we did on purpose it very likely has to do with the pod acting as a placeholder. At the very least letting the pod persist is useful for debugging in case of an accidental crash. Other RunStrategies would immediately destroy it--and the logs along with it.