있다 is closer to "have" in the broad sense, while "갖다" is more like "take" or "own".
While 갖다 is an ordinary transitive verb (requires an object), 있다 is quite different grammatically.
* 있다 (vi. there is, exists). It indirectly indicates possession in the form of "X(subject)-는 Y(pseudo-object)-가 있다" (literally, There is/exists Y in X's possession). This is a common way to show the state of possession in Korean, especially when it means a vague relationship rather than an outright ownership (as in having a problem, having a friend, etc).
- 나는 개가 두 마리 있다 or 네게는 개가 두 마리 있다 = I have two dogs.
- 친구는 무슨 문제가 있는 것 같다 = MY friend appears to have some problem.
* 갖다/가지다 (vt. take, possess, own). This normally means an action of taking something, not a state of ownership. So unlike 있다, it can't be used for things other than direct ownership. For example, having a friend, relative, or an issue cannot be expressed with 가지다.
While 갖다 cannot express a state directly, it can combine with the helper verb -고 있다 to do that, as in 가지고 있다 (-고 있다 here represents a state or condition, unrelated to possession). It also always requires an object (with the object marker 을/를 which is sometimes omitted).
- 이 책(을) 내가 가져도 돼? = Is it okay if I take/have this book?
- 우리 집은 차를 두 대 가지고 있다 = 우리 집은/집에는 차가 두 대 있다 = Our family owns/has two cars.