One of the problems here is that an exchange buying and selling one thing doesn't benefit much from scale. The core of a matching engine relies on knowing everything that happened before it, i.e. every trade submitted which has not been matched or cancelled. This pushes the matching process down to a single thread on a single machine.
I am building a matching engine now (for pleasure) at
https://github.com/fmstephe/matching_engine
(Having said all that I have no idea where their performance problems are coming from - the matching engine may not be the culprit)