I think rclone does all those things
- it implements (truncated) exponential backoff
- it obeys Retry-After headers if sent
It might be that it isn't tuned correctly - the max sleep maybe needs to be higher than 2 seconds?
Try modding the code as I pointed out in the issue and see if you can get it to behave how you want it.