What is UCharacterMovementComponent?

Our controllers are mainly input sanitizers (you can’t shoot while running etc.), leaving this logic to the components would obscure the execution flow. Calling events on a particular component instead of invoking a big mess of callbacks provides an incapsulation, so to speak. You don’t have to inspect all components to see what’s going on. It also has a side effect of making the game much easier to debug and fix in place. I don’t think our approach will fit for more complex games, though - the controller code gets rather convoluted.
It seems like the developers of the engine assume that we should use Pawns for vehicles, but people have a hard time getting the replication right for anything but Character. I have yet to wrap my brains around Unreal’s networking system because our game is a single player :P. We have made an early design decision to inherit most of our base classes from ACharacter, though, because our game doesn’t contain much vehicle action.
For a plane, I would suggest you have a go with UFloatingPawnMovement, if you don’t mind making your own replication routines.
Edit: Here is a question about Pawn replication (quite old, but probably not outdated)