Thanks for the tips @felmue 🙂.

I think I found a working recipe. My conclusions would be the following:

1/ For my motor, I am using P, I, D = 1, 0, 0. I think an even lower P coef would have worked, but the API doesn't accept it.
2/ W/ this values, I reach the maximum speed w/ speed =~30. Then if I decrease the wanted speed, the actual speed decreases as well. When I arrive at -14, the actual spin is 0. Decreasing more will make the motor turn the opposite direction.
3/ I find this negative value odd. I don't understand why it's offseted from 0.
4/ If I go the opposite direction, i.e. -50 and increase, the stop point is not -14 any more. It's about -3. So there is some kind of hysteresis effect.
5/ I'd say that the reduction of my gearbox (1:50) corroborated w/ the resolution of the encoder, pushes the PID params to the low limit.
6/ The position mode works similar to the position. However, when arriving at the set point, the motor oscillates (a lot if high speed; a bit, if low speed). So for me is no go to use this, although my use case does involve stopping at position. I'll use the speed + control it via the program; i.e. decrease it when approaching the target.
7/ I don't understand why the PWM mode oscillates. In my opinion it's a bug. I don't think the PWM mode should have used the feedback of the encoder.

So all in all, I'll be able to continue my project now. 🙂