Earlier quoted context omitted.
Can't you put the gitlab runner on whatever you want and set up CI environments to the runner?
The issue is that the configuration format makes complex jobs difficult to define. It's good for the simple case, but versus e.g. a Jenkinsfile[0] where you get a complete groovy DSL that can interact with it's environment across tasks, pipeline, branch, etc with ease it's rough. Having fine-grained control becomes important. [0] https://jenkins.io/doc/book/pipeline/jenkinsfile/
Apache Groovy isn't "complete" as shipped with Jenkins. It's collections API is deliberately crippled so it doesn't work.