When K8s kills a pod, it first sends SIGTERM (generally), and gives a grace period (Pod.spec.terminationGracePeriodSeconds, default 30) before sending SIGKILL. As you noticed SetupSignalHandler() will capture SIGTERM and tell controller-runtime to shut down
by cancelling it Context. This stops the caches from updating. This Context (or rather a child Context) is the one eventually passed to Reconcile().
Ideally, your Reconcile() methods should be fast and finish well within the grace period. If so, I would say there's no need to check ctx.Done(). If you've written long-running blocking operations into your Reconcile(), or access external resources that may
take a long time to return when degraded, then checking ctx.Done() is a good idea.
Of course, no changes will be processed by your controller while it is not running. If your operator installs an admission webhook (Validating/MutatingWebhookConfiguration) with failurePolicy = Fail (the default), then clients will get failures (and the guarantees
of your validations/mutations will be preserved). Otherwise, the api-server will continue to accept changes to your custom resources. When your controller starts again, it will List all objects of your resource and Reconcile them.