The key take away is:
A variety of factors can affect your send rate, e.g. message size, network performance or Amazon SES availability.
Based of what you've said it seems like you're using a bit of fuzzy logic to try and calculate how many messages you're sending. This won't be perfect so if your AWS limit is 90p/s then getting setting your code lower, e/g to 60p/s makes sense (once again this all depends on how accurate your estimates are).
You should consider the other approaches as you've mentioned, such as "Exponential backoff" as described in the link you provided.
Another thing you can consider is taking advantage of a queue, like SQS. This way you can pick tasks off the list as quick as possible, and if you're a little too quick you can always back off and then jump back on the queue as soon as possible.