Have you tested how much current the motor can handle continuously without ever getting too hot? Run it at constant current for long enough to reach equilibrium, touch it, and if it’s painful to keep your hand in contact with it for more than a few seconds, it’s too hot. Open loop mode is handy for applying constant current without moving.
You can use a higher current limit than that, but then it will be up to the rider to monitor the temperature and avoid overheat. Or if you have a temperature sensor on the motor, you can reduce the current limit when it gets hot, and perhaps alert the rider so they’re not confused by the sudden loss of torque.
It may feel better if you ramp up the torque more quickly at first.
float x = 0.3, y = 0.8;
if(throttle < x) target = (throttle/x) * (motor.current_limit*y);
else target = (motor.current_limit*y) + ((throttle-x)/(1.0-x) * (motor.current_limit*(1.0-y));
i.e. ramp up to 80% torque over the first 30% of throttle, and then ramp up the remaining 20% torque over over the remaining 70% of throttle. So you get plenty of torque at low speed, and then it’s mostly increasing the allowed maximum speed.
And set motor.voltage_limit = throttle * driver.voltage_power_supply * 0.58; (assuming you’re using SpaceVectorPWM, that is the maximum without saturating). So max speed increases linearly with throttle, and the torque ramp can be adjusted until it feels right.