I suggest staying with using the ESP32 as it has a feature rich SDK that is well documented and easy to understand. The single SDK works with the majority of the different “flavors” of ESP32’s that are available.
If speed is a non issue then use an SPI interface. Just be aware that it will lag/jump some when doing any animations or scrolling. This can be reduced by using 2 frame buffers that are allocated in DMA memory. If you use the ESP32-S3 with a display that uses SPI then you should not have any issue with having 20 pins available.
What do the 20 pins need to be available for? analog reading?, analog writing? digital read?, digital write? knowing how many pins are being use for what kind of input/output would be really helpful to have.
This example is a project I am working on. It is an ESP32 -WROVER-B… It has very little DMA memory available so I am running 2 really small frame buffers.
That is also written using the MicroPython Binding so there is going to be a performance impact from that alone… The extra RAM is also using quad SPI which is 4 times slower than the S3 with octal SPI RAM.
In that example The program is reading 2 temp sensors, a current sensor, 2 pins for voltage. one pin for fault detection from a power supply. another pin is an output for sleep control of attached circuits. and there are 2 pins used as PWM output to control the speed of a 50amp DC motor and a 20amp DC motor. There is quite a bit of float math involved for reading the temperature sensors.
I did have to do some manipulation to how the task handler works in order to get the refresh speeds I wanted to the display. Nothing too crazy tho.