In fairness, I've not used GL in a couple of years, but before that I used it a lot, and it all worked, but it never worked very well. Issue organisation was painful, and there was always some new trick that made it slightly easier but never enough (boards, nested workspaces, sprint tools, etc). CI had about a hundred different ways of doing the same thing, because every so often the GL devs would realise their current system wasn't quite general or powerful enough, and add a new way of defining DAGs, or a new way of sharing jobs, or a new way of managing environments. You didn't need to switch, but trying to figure out how all these different approaches interacted by reading the docs was a nightmare.
In general, the documentation and UI were painful, and trying to figure out how to do something usually took me to a GL issue that would describe my problem but either be closed (with little indication of whether the feature was added or what form it had taken in the end), or open with no discussion apart from a bunch of comments from a community manager saying "a bronze supporter said that this is a blocker for them". Trying to figure out where features or configuration lived in the UI was also like pulling teeth, especially with GL's love of icons to explain what everything is.
So it's not that the features are missing, it's that they're all half-baked, and it would take Gitlab another ten years to polish them off and round them out.