Question: the smallest CNN that achieves >90% accuracy on CIFAR10 has how many layers?
I ask that question because you are trying to get a similar result with only 5 layers. In addition to adding layers, you could try adding some of the best practices that help CNNs, for example…
You might find that adding batchnorm before the ReLUs helps, just as it often does with CNNs.
You could try introducing residual blocks. For example, in between layers 1 & 2 you could add something like this.
# Feed layer1_output through
linear(300, 300), ReLU, linear(300, 300), ReLU -> intermediate_result
# Then add skip connection
layer2_input = intermediate_result + layer1_output

That is going to make for a lot of parameters, so what about using some sort of bottleneck. e.g.
# Reduce size
linear(300,100)
# Feed through
linear(100, 100), ReLU, linear(100, 100), ReLU
# Increase size
linear(100, 300) -> intermediate_result
# Then add skip connection
layer2_input = intermediate_result + layer1_output

This has 80 000 (not counting the bias) parameters instead of 180 000 (not counting the bias) for the previous example, and who knows, it might work just as well.
I am sure there are other tricks used in CNNs that could be ported to a feed forward net.