The problem with 5 ns in the `timescale directive is that it is illegal syntax according to the IEEE Std. Only 1, 10 and 100 are permitted.
However, there is also a problem with your other code example:
`timescale 1 ns/1 ns forever #2.5 clk = ~clk;
That does not produce a 200MHz clock. It produces a 166MHz clock. You specified a time precision of 1ns, which means that fractional delays will be rounded. In this case. 2.5 is rounded up to 3, which means you end up with a period of 6ns, not 5ns. You can see this by adding the following code to your testbench:
initial $monitor($realtime, "\tclk=%b", clk);
Then you will see the period of clk is 6ns:
0 clk=0 3 clk=1 6 clk=0 9 clk=1 12 clk=0 15 clk=1
One way to achieve a 200MHz clock is to use a precision of 100ps:
`timescale 1 ns / 100 ps forever #2.5 clk = ~clk;