The main thing that limits the size is latency in propagating large blocks. But most miners already have most of the transactions in each block. All you really need to send is a small data structure that lets the miner reconstruct the full block, from the transactions he already has. An invertible bloom lookup table makes that pretty easy: http://www.i-programmer.info/programming/theory/4641-the-inv...
Using this, a home bandwidth connection could handle about 45,000 tx/sec, which is more than Visa at peak: https://gist.github.com/gavinandresen/e20c3b5a1d4b97f79ac2
The other problem is blockchain storage. They're planning to prune old empty addresses, which should help a lot. A more radical solution is to store the full blocks only for the last couple months, and only a linked set of hashes back to the beginning. That might be a bigger change than Bitcoin can handle, but another currency could do it.