Put SSD's in the machine
pump RAM up to 16 GB and allocate 8192 to FM Server cache
evaluate network traffic and watch for useless data getting read and pumped over ethernet - optimize your solution
watch for other useless processes running , like virus scans, indexing, etc.
Increase the AWS instance to something bigger than 2 cpus...
In general you will get the best clues from looking at the FMS stats log. Unfortunately it is off by default so if you did not turn it on then do so now and let it collect for a week or so. Any server has 4 potential bottlenecks: processing power, memory, disk i/o and network i/o.
Network i/o is always going to be somewhat of an issue with servers out there in the internet. But the FMS stats will give you some good info on the other 3 bottlenecks.
As Wim notes, the type of Amazon server you have makes a big difference. Granted they charge a lot more for a beefier server, but it really does make a difference. But if you can afford it, their powerful Amazon Web Services servers really are about as fast as you can get for access over the internet. Wim gave you the bottle necks of the hardware/network and those are often just a matter of how much money you want to spend.
But back to what you can do in your solution. First of all... do you really need 100 databases? Could they be combined into a lesser number of solutions? Secondly, there is a lot that can be done to enhance performance. Trying to minimize sorts, especially on large found sets. Avoid unstored calculation fields where possible. Use Perform Script on Server (PSoS). Virtual reporting with globals can be a whole lot faster, especially using PSoS. Clean up layouts using new themes and reducing graphics. Especially make sure graphics are not higher resolution than the screen unless it is for print. Those are just some things to start with.