Thing is microcontrollers are sequential machines, which is fine for a lot of use cases.
However there are plenty of occasions where you need things to happen without the use of a clock, and somw where timings are measured in terms of a few tens of ns, difficult to do that with a micro, but very easy with some glue logic or a small gate array.
Something like a delta sigma modulator is easy in an FPGA, but you try to get it fast enough in a micro....
Or take for example a 50MHz clock, and a requirement to divide it down to something slower, say 12.5MHz such as one may use to clock an AD converter, this is trivial with a couple of flipflops but practically impossible using a program running on a micro (Some have on chip counter timers that may make it possible).
Another case where discreet logic is sometimes preferred is in safety critical systems where having a very small state space makes verification much easier, with only a few bits of state I can reason about the system fairly easily, less so when I have a KB of ram...
Sometimes there are things you could do in software, but that are so much easier and more reliable in hardware that you find yourself placing a picogate or so just because it makes the need for tricky interrupt back magic to meet some timing constraint go away (And besides hardware interlocks on syncronous gate drivers for example are a good thing).
Micros are useful tools, but all tools have their place.
Regards, Dan.