There are legitimate places where asynchronous logic can be very useful: specifically when you are interacting with the "real world" which is not synchronous. But once you get beyond that, going back to synchronous design is usually best.
http://www2.imm.dtu.dk/pubdb/edoc/imm855.pdf
https://www.researchgate.net/publication/245530456_Asynchron...
https://www.researchgate.net/publication/331181568_Asynchron...