Let me just point you to a tutorial I made which touches on this (in 2D).
https://godotdevelopers.org/forum/discussion/19373/tutorial-pixel-perfect-moving-platforms-with-one-side-collision
In short, I use custom collision detection to check whether the player has landed on the platform (though you can just use areas or so if you don't need it pixel-perfect) and if so, keep changing his global_position in the platform's script until he jumps, walks off of the platform or gets stuck on a ledge.
As for using linear_velocity, the issue I had with it is that you need constant gravitational force, because it only works when the bodies are touching. In my code I only added downward momentum to the player if he wasn't on the floor, which in practice meant he would flicker between >0 and 0 speeds every frame if he was standing on something. Because of that, linear_velocity would only affect him every other frame, moving him at half the speed I set it to.
Also, keep in mind that (I think) linear_velocity only works on certain types of nodes, the ones affected by physics, like RigidBody. It might not work with static or kinematic, though don't quote me on this.