You can use the following code to convince yourself.
N <- 1000
P <- 3
# Generates some random data
data <- matrix(data = rnorm(N*P), nrow = N, ncol = P)
# Assignate linearly separable classes
labels <- (data[,1]+data[,2]>0)+1.
# Make sure that the data can be separated
plot(data[,1],data[,2], col = labels, xlab = 'x1', ylab = 'x2')
model <- Rtsne::Rtsne(data)
# Observe this result while varying P
plot(model$Y, col = labels, type = 'p', pch = 21, xlab = 'tSNE x_1', ylab = 'tSNE x_2')
This is what you would observe when P is 3 (only one irrelevant attribute with respect to the linear separation, we are close to reproducing the linear separation).
And for P is 15, the tSNE cannot reproduce the linear separation.
What happened ?
This is simple. The tSNE method relies on pairwise distances between points to produce clusters and is therefore totally unaware of any possible linear separability of your data.
If your points are "close" to each other, on different sides of a "border", a tSNE will consider that they belong to a same cluster.
This was exactly the point of the simulations above. When the number of dimensions is large, points look close to each other, no matter the side of the border they belong to. This is what tSNE fails to capture here.
On the other hand, when the number of irrelevant dimension is low, close points had "no other choice" but to be on the same side of the border.
Even though you may have a nice performance with a neural network, it may not mean that your data is linearly separable (unless there is only one unit in your neural, hum, network). Indeed neural networks can recognize non linear boundaries. If you want to test how "linearly separable" a data set is, you should use linear Support Vector Machines or regressions.