Also, in Jenkins' defense, it's often nice to have a general purpose automation server. I never liked Jenkins, but I miss being able to create jobs that check the health of your deployments, report filesystem usage to user of your developer workstations, run very large-scale end to end integration tests independently from builds, update wikis and documentation automatically. There is plenty of automation that can happen outside of code CI that may not be related to code changes at all but is still useful.
Understanding of course Gitlab does have a notion of scheduled jobs that just run on a timer rather than being triggers by a changeset push, but that still isn't enough, and embedding shell scripts in yaml strings is a very poor substitute for Jenkins' Groovy DSL when there is any kind of complicated logic required by your jobs.