Our first architecture was indeed peer-to-peer where all components discovered each other. It is difficult to isolate failures on this kind of architecture. A reliable queue makes a big difference in zooming in on the root cause of the problem (a queue producer or a queue consumer problem).
Regarding latency - we are aiming for a few ms tops. preferably less. So bulk events using S3 was not considered