1. 저는 배고*파니까 밥을 먹었어요 - wrong.
2. 저는 배고팠으니까 밥을 먹었어요 - okay but very natural.
Best sentence: 저는 배고파서 (or 배가 고파서 - better) 밥을 먹었어요.
-아/어서 Is the best choice for this kind of readily understood, universal logic.
3. 가게에 갔는데 버섯은 없었어요 - okay but only makes sense in a special case..
4. 가게에 가는데 버섯은 없었어요 - wrong.
More common sentence: 가게에 갔는데 버섯이 없었어요.
b) Someone said that the first clause must be in present tense while the second clause must be in past tense.
There is no simple rule about the dependent clause tense because it is affected by the overall meaning and how (i.e. using what verb ending) the two clauses are connected.
For example, an -아/어서 clause is always in the present tense because -ㅏ/어서 implies a clear, established state. -기 때문에, -(으)니까, -ㄴ/는데 can be in any tense depending on the meaning.
In your #3, #4 examples, it should be in the past tense because it is talking about some fact (no mushrooms) about the store which could only be known if you actually went(arrived) there. 가게에 가는데 is possible in different scenarios - e.g. 가게에 가는데 어떤 사람이 나한테 도와달라고 부탁을 했다 (here it signifies while you were going there).
Generally, when the clauses are tightly connected by -고, -아/어서, and some cases of -며 or -면서, etc, only the main clause reflect the tense, while for looser connections made by other phrases, both clauses can have their own tenses. But this is a difficult subject that should be learned case by case.