As you say, they are similar but also different in important ways.
-도록 focuses more on the desired state than action itself, i.e. it describes doing something hoping for some intended result, but the result is often something that takes time to materialize.
Because of this focus on the result itself, the subject of the sub-clause is usually different from that of the main (i.e. you do something for other people), unlike -기 위해서 which always has the same subject.
-기 위해서 (and -려고 too) focuses more on the action taken - the purpose is just one element describing the action. It works best for personal intentions.
-도록 is much like "so that ..." in English, while -기 위해서 is like "(in order) to ...".
Some examples:
- 친구를 만나기 위해/만나려고 시내로 나갔다 (O).
- 친구를 만나도록 시내로 나갔다 (X) = a simple reason not warranting the use of -도록.
- 자는 아이가 깨지 않도록 조용히 얘기했다 (O) = talking quietly so that the sleeping baby won't be disturbed.
- 자는 아이가 깨지 않기 위해서 조용히 얘기했다 (X) = subjects don't agree.
A. 나는 오늘도 꿈을 이루기 위해 열심히 일한다 (O). = in order to realize my dreams (strictly personal).
B. 나는 오늘도 꿈을 이루도록 열심히 일한다 (X?). = like "so that I realize my dreams" (a little unnatural).
C. 나는 오늘도 꿈이 이루어지도록 열심히 일한다 (O?). "so that my dreams are realized" (better, but not as good as A)
C sounds better than B because -도록 is more natural focusing attention on the resulting state (the dreams) making it the subject. But when the intention is strictly personal, -기 위해서 or -려고 is usually more clear.