Gitlab CI is pretty good, but its still missing some features that other tools we have used (well, Jenkins) provides out of the box. For instance, coverage and defects. Both Jenkins and Gitlab track coverage and defects (ie linting errors, static analysis etc), but Jenkins can provide graphs of historical coverage, and fail a pipeline if coverage percentage decreases. Gitlab can only report the current numbers, there are no dashboards of historical coverage.
For test reports, Gitlab and Jenkins can both parse junit xml test reports, but gitlab will just tell you how many tests have failed in the merge request, where as Jenkins will provide a deep dive in to what test failed, why, what the expected output was etc. For defects, Jenkins will show you a file by file report that you can drill in to and see the specific lines that have defects. Gitlab just shows you a raw number of defects.
I do massively prefer how Gitlab CI is setup and run, its much easier to setup your pipelines. I was never fond of writing Groovy scripts to run the pipelines.
Maybe these things are available with Gitlab Ultimate; we're just Bronze level subscribers. Ultimate is an extra $15 per seat per month..