Call and Put Prices Equal at Forward Price - Why?

Consider a European call and put with values $C_t$ and $P_t$, respectively, under the Black-Scholes model. By put-call parity, $$C_t - P_t = S_t - Ke^{-r(T-t)}$$ for expiration time $T$. Note if $K = S_te^{r(T-t)}$ we get $$C_t = P_t. \qquad (1)$$ Of course, $S_te^{r(T-t)}$ is the time $T$-forward price of the stock at time $t$, which is arrived at from a no arbitrage argument and not just taking expectations. That is, $$S_te^{r(T-t)} \neq E_P(S_T \mid S_t) = S_te^{\mu(T-t)},$$ where $P$ is the physical measure and $\mu$ the drift rate.

I see that (1) holds simply by put-call parity, but I'm seeking a deeper understanding. Is it that, the call and put prices are equal because, under the risk-neutral measure $Q$, the expected value of the stock is the strike price (which is the forward price in this case)? That is, $$S_te^{r(T-t)} = E_Q(S_T \mid S_t) = K,$$ and hence the stock is equally likely to finish above or below the strike? Or, is there something deeper going on, like a no arbitrage argument?

Certainly, you must agree that $$C_{T}-P_{T}=\left(S_{T}-K\right)^{+}-\left(K-S_{T}\right)^{+}=S_{T}-K.$$ Therefore, since $$C_{t}=e^{-r\left(T-t\right)}E_{Q}\left[C_{T}\right]\text{ and }P_{t}=e^{-r\left(T-t\right)}E_{Q}\left[P_{T}\right]$$ it follows by the linearity of $E$ that $$C_{t}-P_{t}=e^{-r\left(T-t\right)}E_{Q}\left[C_{T}-P_{T}\mid \mathcal{F}_{t}\right]=e^{-r\left(T-t\right)}E_{Q}\left[S_{T}-K\mid \mathcal{F}_{t}\right]=e^{-r\left(T-t\right)}\left(e^{r(T-t)}S_{t}-K\right).$$ The put-call parity follows.

The Call-Put parity $$C_{T}-P_{T}=\left(S_{T}-K\right)^{+}-\left(K-S_{T}\right)^{+}=S_{T}-K$$ will exist under any condition, since it is pretty much a mathematical fact.

However, I think the straight answer to your question $$K = S_te^{r(T-t)} => C_{t} = P_{t}$$ is : not always, but only under an efficient market i.e. no-arbitrage, frictionless and complete market.

You can think of a not-so-rare market scenario when a very popular company issues its first stocks. Market expectations from the stock are high. It is not unusual to find call options to be highly overpriced compared to puts. Even when $$K = S_te^{r(T-t)}$$, you may find that $$C_{t} >> P_{t}$$. This may seem like a case of transient arbitrage, but think of an opposite scenario in case of a distressed stock - lack of liquidity may be the problem there. The efficient market hypothesis is not valid in these cases.

Fundamentally I think the definition of the forward price is the one that leads to call and put prices being equal, and not the other way round, i.e. $$C_{t} = P_{t} => K = E\left[S_{T} \right]$$ This is converse to your question, but there is a subtle difference here which is important.

This forward price is the expected future price of the asset under some measure. It so happens that only under efficient market hypothesis a risk-neutral measure $$Q$$ can be shown to exist, and you can use this to prove that this forward price is equal to the expected future price $$K = E_{Q}\left[S_{T} | S_{t} \right] = S_te^{r(T-t)}$$.

A speculator can define an alternate probability measure $$P$$ under which $$E_{P}\left[S_{T} | S_{t} \right] > S_te^{r(T-t)}$$. He will speculate different Call and Put prices under this measure, but the Call-Put Parity will still hold. $$C_{t}^{P} - P_{t}^{P} = E_{P}\left[(S_{T} - K)^{+}| S_{t}\right] - E_{P}\left[(K - S_{T})^{+} | S_{t}\right] = E_{P}\left[S_{T} | S_{t}\right] - K > 0$$

Since you write under BS model, it is a tautology in this model.
Assume you use Black, which you can without loss of generality, as one can easily be transformed into the other (FX is easier to show with covered interest rate parity in my opinion).

Looking at $$d1 = ( log(F/K) + 0.5*σ^2*t ) / (σ*sqrt(t))$$ $$d2 = d1 - σ*sqrt(t)$$ it is not immediately obvious what happens. However, we can express $$d2 = ( log(F/K) - 0.5*σ^2*t ) / (σ*sqrt(t))$$

Now, $$log(1)= 0$$ which means we are really just left with a positive and one negative value of the $$\sigma$$ term and all else is equal. The below uses Julia to define the Black model and get call, put as well as the result for $$d1$$ and $$d2$$ as an output. Julia uses 1-based indexing. $$N(d1)$$ and $$N(d2)$$ always sum to 1; if $$F=K$$ and $$N(-d1) = 1-N(d1)$$ by definition (same for $$d2$$). Now, if $$F = K$$, you can immediately see that the equations will always be identical. Now, BS does not need Put-Call parity, but wikipedia shows how to get the put formula by applying it.