What happens if you try:
EXEC sp_executesql N'SELECT DISTINCT egm.matrikel_id
FROM #temp egm
INNER JOIN e_gis_overfladevand v
ON egm.geom.STBuffer(@buffer).STIntersects(v.geom)=@1',
N'@buffer int, @1 int', 250, 1
Your slow query is not really a parameterised query; there are no parameters, only local variables. And when compiling the batch, SQL Server does not know the values of these variables, but makes standard assumptions. What those assumptions are for spatial queries, I don't know, but they don't seem to be very good, let's put it at that.To resolve this, you need to make the values known, and OPTION (RECOMPILE) is one solution. My suggestion above is another. The difference is that the above results in a cached plan that can be re-executed with other values.
It seems that you have a misconception about forced parameterisation. With forced parameterisation, the values of constants in a query are replaced with parameters. Thus, a query like
SELECT DISTINCT egm.matrikel_id
FROM #temp egm INNER JOIN e_gis_overfladevand v
ON (egm.geom.STBuffer(250).STIntersects(v.geom)=1)
would become
SELECT DISTINCT egm.matrikel_id
FROM #temp egm INNER JOIN e_gis_overfladevand vON (egm.geom.STBuffer(@1).STIntersects(v.geom)=@2)
However, my reading of the execution plan suggest that this does not happen, so it may be that forced parameterisation does not apply to spatial queries. But that is not relevant to your problem because it is due to the unknown values of the variables.