How to receive payments online to single address per user in scalable way?
Use Bitcoin Core in server mode and use it's notification functions:

server=1
blocknotify = curl\yoururl
walletnotify = curl\yoururl


Set them up to make a call to your app.

This way, you won't be making expensive RPC calls to Bitcoin Core. You will only be receiving notifications for operations  that Bitcoin Core itself already is making. So you won't bring any extra load to Bitcoin Core. You will be limited by it's own scalability.


  how "big players" like Cryptsy do receive payments?


Most big players are relying on Bitcoin Core's scalability running in server mode without bringing extra load to it as far as I know.


  But I heard that it is possible to change transaction id in block
  chain, so is such solution safe?


Not after they have received a confirmation. So the method you described works if you wait for the blocknotify call for a TX before you update your users balance.