Your initial analysis is pretty good, but perhaps overemphasising the risk to the corp. The real issue is that five cards from 45 is a very variable draw, and the results are a pretty unpredictable. I'll examine the two cases separately.
Runner
As you say, the runner can mulligan fairly freely - there isn't much of a downside.
Obvious mulligans:
- No icebreakers, or only a code gate breaker.
- No economy boost, combined with high-cost icebreaker. (If you have a cheap starter icebreaker, consider living without the economy boost - time is always on the corp's side, so press the pace while you can.)
- If your deck's based around a key three-card combo or the like, and you haven't drawn any of them. (But don't try for two; your odds aren't good enough.)
However, you still need to understand what your 'typical' opening hand looks like, because you don't want to make the situation worse while trying for better! It's important to understand the odds of getting what you want - they're often not as good as your intuition says.
For example, if your deck is 1/3 icebreakers in a 45 card deck, your chance of getting at least two in the opening hand is only about 55%. If you have 8 specifically anti-sentry icebreakers, your chance of drawing one of them is about 65%. (If it's crucial to have one, you have the same chance again in a mulligan, of course, for a total chance of about 90%)
A runner deck usually needs to be more tactic-focussed than the corp, but that's mitigated by your comparative ease of draw. Unlike the corp, you can afford to push your draws early if you're missing a useful element. Understand which kinds of cards your deck actually needs to open with, and be prepared to let go of ones you merely want.
Corporation
There's nothing inherently more risky about mulligans for the corp - since cards are reshuffled, the corp gets the same chances the runner does. The problem is that draws are highly variable, and the corp is more vulnerable to extreme hands than the runner, so - appropriately - you need to be more risk-averse.
Obvious mulligan conditions:
Multiple agendas, obviously. Three must be mulliganned, but even two should be strongly considered - it's too many to protect, and you don't know if you're about to draw a third. (If you have 9 agendas in deck, your chance to draw two or more of them in a mulligan is only about 26%, so if the rest of your hand doesn't defend those two quickly, redraw.)
Lack of ICE. What this means is highly situational, however, and depends on your opponent. Against an Anarch virus deck, it's vitally important to protect HQ / R&D with something quickly, but usually not a panic to ramp to your high-power stuff - favour fact ICE over economy or power.
If you're playing Jinteki ambushes, on the other hand, it can be more important to get decoy servers up early than heavy protection - burn the runner early and he'll be more cautious about remote servers in future.
Economic development is usually more important but less urgent for a corp, but that depends a lot on your deck. Weyland economy powerhouses shouldn't actually worry that much if they don't draw credit boosters to start with; there should be one along shortly. NBN tag decks should consider drawing for one if they start with high-cost ICE and not enough ways to rez it.
More than the runner, the corp needs to understand what their deck is intended to do. Corp decks are often broader-based than runner ones; you should be able to "settle" for a wider variety of opening hands.
Summary
Mulligans are pretty low-risk in Netrunner; if your hand is worse-than-average you should try to improve it. However, it's very important to understand what an "average" hand look like for your deck - if your hand is a better than average draw, but doesn't have the key cards you want, it's still risky to try for them. You're likely to make it worse.
For the mathematically inclined, grab a spreadsheet. Your chance of drawing a card or card type in your opening hand, if there are N of that card type in a deck of D cards, is
1 - HYPGEOMDIST (0, 5, N, D)
(Excel syntax used here, but all spreadsheets should have something very similar)