I think the ESPs are really the perfect balance of functionality to (low) cost. That and the excellent beginner-level documentation and community.
Honestly for many projects needing analog it might be "good enough", but it leaves a lot to be desired, and like the parent said, the moment you're looking for a a i2c adc you end up looking at another MCU anyway.
That's if you need an analog adc which my projects don't (sensors are all i2c anyway) but definitely takes away from being used as a general purpose chip.
It is a shame espressif didn't put a better adc in there.
* The recent AVRs are all differential ADCs, which is highly useful as "voltageA - voltageB" is a common measurement in practice. And its quite different than ChannelA (read a fraction-of-a-second earlier) - ChannelB (read right now), for multiple reasons. (Common-mode noise for one, you'll want to sample at the same time to negate common-mode noise)
* Anti-aliasing filters should be applied for best-practice design against your expected sampling rate... but RC 1st order filters have poor performance. The free-opamps you get from STM32G4 / AVR DB / TI's MSPM0L are easily turned into Sallen-key 2nd order filters, or chained together into 4th order filters or beyond. Or in more practical terms, an RC filter achieves -80db (aka: 10-bits of attenuation of aliased signals) after 4 decades. So a 100Khz sampling rate only has an effective bandwidth of 10 Hz.
Meanwhile, a 2nd order filter gets 80db in 2 decades, so you have a bandwidth of 1Khz.
Yes, despite having a 100Khz sample rate (or beyond) in the digital realm, it only has accuracy and efficacy in a much smaller domain. You have to perform basic analog analysis if you care about any bit of accuracy.
* In the case of STM32 or Ti (which have only single-ended OpAmps), you can build a differential OpAmp to perform VoltageA - VoltageB as a preprocessing step before the ADC.
* I'd say the most common use of differential signals is probably current-measurement across a 0.1 Ohm resistor. If 1-amp is flowing the resistor will have 0.1V across it. Furthermore, there's a common-mode voltage of unknown (ex: the resistor might be 2.3V to 2.4V on the two sides one second... but another time it will be 1.5V to 1.6V), so a single-ended measurement is not ideal. So you need to get rid of the common-voltage while simultaneously taking this difference-measurement.
-------------
So basically... OpAmps win so hard its not even a fair fight. Free OpAmps on your microcontrollers (STM32G4, AVR DB, and TI MSPM0L) chips just win in all things analog, even in the most basic case of just sampling into an ADC in practice.
Of course, for precision design, you need to build an analog circuit out of precision parts (ie: a dedicated precision OpAmp rather than the general-purpose ones you find for free on a uC). But many basic designs can be solved with the free opAmps from these uCs, as long as you taper your expectations. (In any case, its far better than what ESP32 will accomplish without opamps of its own)
You really end up with "the sum is greater than each of the parts". ADCs are so much more useful when you have an OpAmp or two at your disposal.
----------
Note: many uCs have analog comparators which perform "VoltageA > VoltageB" vs "VoltageA < VoltageB" comparisons... which might be sufficient and simpler than using the ADC. I don't think the ESP32 has any Voltage-comparators though.
So its really the mix: an ADC here, a Voltage Comparator there, a few OpAmps for free, a Zero-crossing detector here... suddenly you can build many designs from these $1 or $2 chips with incredible amounts of accuracy. (Well, incredible for $1 or $2 of course. These parts can't replace more expensive analog chips...)