We've been using submodules for almost a decade. It's easy to make mistakes, which is bad, but they're hardly unusable.
Well, I might overstated how slow it was to check them out in serial. They are still PITA thanks to specific behavior, missing features (both in git and in 3rd party tools such as bitbucket), etc..
The benefits oftentimes overshadow the issues with them, but there are drawbacks to using them.
Just curious, were there any changes to sparse-checkout? It had abysmal performance in pre-2.x if you threw more elaborate paths at it, or more paths in general.