Two years later: Just in case anyone runs into that problem, I found a solution that work from linux userspace:
In the kernel messages (which can be viewed with the dmesg command), there is a line like:
[ 0.358842] m25p80 spi0.0: w25q128 (16384 Kbytes)
or (in newer OpenWrt versions):
[ 0.639801] spi-nor spi0.0: w25q256 (32768 Kbytes)
This is a message from the spi-nor kernel driver after detecting the actual flash chip. So it is not dependent on the flash size that is baked into the firmware image, but shows the real size of the flash chip. Both of the example lines above are from a firmware made for the Omega2. The first is run on an actual Omega2, the second shows 32M so it is a Omega2+.
The only gotcha with this is that the dmesg buffer is not infinite and will loose older lines when too many new ones arrive. This means detecting the flash chip size needs to be done shortly after startup.
So I put the following line into a startup script (e.g. /etc/rc.local) :
dmesg | sed -n -r -e '/spi0.0: .*w25q/s/.*(w25q.*\))/\1/p' > /tmp/flashchip
With this, the chip name and size is captured and can be read any time later from /tmp/flashchip to detect an Omega2(S)+ vs Omega2(S).
Finally - Solved!