The object?.function() is working like a
if(object != null) object.function();
So, it is a short form to avoid null exceptions. Esp helpful when you are unsure is something is initialized and it's not really important that it happens. But it's still a null check so it's better to avoid it if it can be avoided.
Another suggestion I would give you is to work more with [Serializedfield] instead of searching for components. The component search is very time-consuming. If you need to search for a component, try to avoid doing it in Update and if possible, cache it in a local variable in Start or Awake. I know it's not possible in all cases.
I tried to look for the stuck issue. But I could not figure it out... it might be fixed with the two ground detectors, at least you should be able to jump in that case. I think it was partly related to the fact that you were half off the platform.