Finally, I figured it out! There is an obscured parameter in older ('stable') versions of Geoserver, which was finally exposed through SLD vendorOption in the latest release of Geoserver/Geotools. This parameter MIN_GOODNESS_FIT is used when labeling polygons in particular. Based on MIN_GOODNESS_FIT geotools determines if From geoserver docs:
Geoserver will remove labels if they are a particularly bad fit for the geometry they are labeling.
the default value is 0.5, so anything lower will allow more lables to be placed.