Another idea could be that we stream the transaction after some threshold number (say 100 or anything we think is reasonable) of empty xacts. This will reduce the traffic without tinkering with the core design too much.
Amit, I suggest an interval to control this setting. Time is something we have control; transactions aren't (depending on workload). pg_stat_replication query interval usually is not milliseconds, however, you can execute thousands of transactions in a second. If we agree on that idea I can add it to the patch.