I’m not convinced that the “island in a lake” issue is a mkgmap one.
If there’s an island in a lake, it’s normally done by making the lake a “multipolygon” (having an outer ring and an inner hole). That way the part between the outer shore and the inner island is clearly water, and the part inside the inner island clearly isn’t.
Edit: If you can perhap point to an area where this occurs people can perhaps have a look at it (to see where the data’s come from, for example - it’s possible that some “forest” has been imported that isn’t, really).
b) The lake (and other lakeside areas further north) don’t have trees on them.
I’d definitely start by trying to split way 258025172 into smaller ways (not even initially creating a multipolygon) so that what’s tagged as being “trees” is the part with trees on it, and what’s not tagged as “trees” isn’t.
There are draw order issues with mkgmap, but this doesn’t look like one yet.
Draw orders have to be set in the TYP file, so if you havent used one yet, use it.
As already mentioned, it should be mapped correctly on OSM first, with multipolygons.
Then you have some tricks in mkgmap, to render very big polygons (water or forest) at a lower level, with area_size()
Example natural=water & area_size() >=50000000 [0x3c resolution 14]
See for my TYP file and styles https://github.com/ligfietser/mkgmap-style-sheets
PS please consider that “big” here in the Netherlands can be of a totally different dimension (thanks to the micro mapping in this part of the world) than for instance big polygons in Australia