Before this we were using https://github.com/actions/actions-runner-controller but that's running on K8s instead of VMs. So along with common limitations of running CI jos in K8s/container, it cannot have exactly the same environment as the official GitHub runners. Maintaining a K8s cluster was also very difficult.
We were using something similar at $EX_EMPLOYER, but we needed explicit steps in our workflow to start and stop the runner. It was error prone.