[IO.Path]::GetFullPath('script.ps1') uses the process's current working directory. That's not the same as powershell's CWD. To change the process's CWD (to get the output you are expecting) you'd have to use a .NET API to change the process CWD as opposed to cd .. which is internal to PS.

I'm confident that this isn't a bug, but by design. One reason for the design is that PS has the notion of CWD outside of the file system. So your CWD can be in the registry, in the wsman provider, and in any 3rd party provider plug-in that chooses to implement directories. That can't be mirrored in the process's CWD, since it strictly applies to the file system.

Generally things work pretty well when you mix PS concepts with .NET concepts. However there are some places where there's an impedance mismatch. This is one of them.