I wouldn’t necessarily say that things can “go wrong”, but that you might have to change the way you’re doing things when networking. For instance, if you have a look at JCsUMTRON, there’s this “cut-scene” when a level starts. What I’m doing there is quite a bit of scripting which is spread across the “Game”, “Teams” and “individual cycles”. There’s some Coroutines which involve some “waiting for things to be finished”, and some camera switches, camera effects etc.
In “single player mode”, I didn’t have to think of much - but when it came to the network implementation (which is fully synchronous, i.e. the cycles spawn pretty much at the same time on all clients, if there’s no significant different in lag times), I had to approach this in a very different way.
What I have right now is two completely different code paths for “network” and “single player”, which is not really nice (and not really necessary). If I had started it multiplayer right away, I could have come up with something that works smoothly no matter whether it’s multiplayer or not. Obviously, there’s still some parts which are “network only” while others are “single player only”, but doing it right from the start could have minimized that.
Obviously, it’s never too late and I could still refactor this to be more maintainable, but that consumes quite a bit of time.
Another issue I ran into was that I have quite a few “data objects” which originally were childs of MonoBehaviour. However, I can’t easily instantiate those the way I needed it for networking. So, to make networking work the way I wanted it to work, I converted those MonoBehavior-childs to simple C# classes, which do pretty much exactly what I want (that approach has other disadvantages, though, i.e. you can’t directly set properties of simple C# classes in the editor).
I guess “in a nutshell”: You need to have an awareness of what to make an RPC, and what not. You can easily call an RPC directly from within your code, but - obviously - you can’t call a non-RPC method over the network. Sometimes, you may want to “wait” for the clients to be “done” with something, which then involves callbacks. That way, what previously was a simple “loop” may become a rather complex distributed interaction between different machines involving stuff like “send out an RPC to everyone and then wait until all the callbacks are received”… but… what if one of the clients crashed meanwhile?
I kind of love that, though 
Also, there’s restrictions on the parameter types you can use on RPCs, which is also something you should best be aware of when designing your “game API”, or you’ll end up having a lot of “conversion methods” that do nothing but convert your “native” datatypes to datatypes you can use for networking (which, however, can also be a very good, and in some cases necessary thing to do).
Another thing that may not be trivial: You need to somehow manage your “multiple players” in a way that works smoothly when networked. The earlier you “do this right” (i.e. compatible with networking), the less work you’ll have in the long run 
On the other hand: This may also depend on the type of game you’re developing. Might be that in some cases, all you need to do is change “Instantiate” to “Network.Instantiate” and add a bunch of network views, and “it just works”. But then again: It’s best to find that out and see it actually working as early as possible in your project 
Sunny regards,
Jashan