To avoid normalization, you'll probably want to simply adjust your output parameters, taking into account the distribution of results. As Newt mentioned in his first post, because of the inherent nature of Perlin noise and interpolation, values at the extremes will be extremely rare compared to values in the middle (simplex noise will be the same).
As you can see with your own simulation, using classic noise, values above and below 75 and 25 respectively would probably appear less than once in 100 million.
I found this on stackoverflow - stackoverflow.com/questions/11487759/perlin-noise-to-percentage - if you're looking for a certain percentage of your values to be x, this is a pretty great solution.
If you want to get exactly 30% water (or some other specified value), you could do this.
Generate your height-map.
Place all the height-values into a list.
Sort the list.
Pick the value, that appears 30% into the list, as your water-level.
Basically instead of <0.3 for 30% as would be with true random noise, it would be something like <0.43 (that's just a completely wild guess, don't take it at face value) 0.461. The great thing is that if you find the number the way described, you just need to check, find, and set the value once, and it will stay very consistently as 30% of your returned values will be under that value.