In general you are right. Communication is one of two main bottlenecks, and the other one is synchronization.
In practice, one can partition a task well so tha each CPU will do infrequent message exchanges.
That is why only a few of very limited CPU intensive tasks are good for supercomputing.