Synchronous systems are driven by clock networks. Asynchronous ones aren't. SOC has automated tools for timing analyzis and optimization. You can run these tools at different points in the flow. After clock tree synthesis you can perform optimization like moving blocks around and changing/adding clock buffers.
For example, if there is too much scew, you can replace and reroute the design, change the clock tree scheme, use different buffers/etc. When you do this optimization you possibly are using more area and more power,
Also, most good ASIC libraries include two times of buffers, one for general use and one specifically for clock signals, make sure you're using the appropriate ones.