Differential analog signal conversion using Arduino Uno
Given your requirement to measure a 20mV signal on top of 2.5V, one solution to this is to use an instrumentation amplifier. To get 10-bit-ish accuracy out of a 20mV signal you need 20uV-ish stability. One choice, only available in a rather tiny MSOP8 package, would be the AD8237. Use the maximum gain possible that will not result in any possible saturation (of the amplifier or overrange of the ADC). That way you can get about 10 bits resolution rather than just a few bits- maybe 200-250 times better.

You could use a lower performance difference amplifier, but it would greatly compromise the measurement.