tl;dr; In my experience, rows written pricing dominates the other categories so everything else being equal, you shouldn't experience a big difference in pricing because those are exactly the same.
The rows written and rows read included allowances and pricing after the included allowance are identical.: Tie
The storage allowances are the same, but D1 costs 3x more once you get past that. DOs win
DOs are billed for wall clock time, which will probably be more expensive than the CPU time costs for Workers but not necessarily. D1 wins
DOs and Workers both incur charges for requests received. If you do everything over HTTP, you will in theory have twice as many requests, one coming into the Worker and one coming into the DO but the DO one is half as expensive so that's a 1.5x for request count. D1 wins
However, you can use WebSockets to talk to your DOs and each WS message cost 1/20th as much as normal DO Request and bypass the Worker so that's 1/40th the cost per WS message compared to Workers Request costs. DOs win and eliminate the D1 win above if you use WebSockets
Also in DOs favor from a pricing perspective, depending upon your query patterns, you have an opportunity to reduce your rows read costs with DOs because N+1 query patterns have essentially the same latency as complex join queries. You can do filtering and query decision making in code based upon the results of the first query and issue optimal follow up queries. However, with D1 the round trip count dominates latency so you are much more inclined to get more than you need in one round trip. DOs win