가지다 & 소유하다 both means "to have, or to possess". These two can be replaced with one another in most cases, especially when they are used as verbs.
있다 is a strange one, and is a bit different. It's also widely used to signify that you own something or have someone around you. But the second definition of 있다 is "something is there: that it exists". And sometimes 있다 conjoins other verbs to emphasize the state of being, or action.
All three can be used to indicate that you are in possession of something.
나는 책 10권'을' 가지고 있다. (*notice the "있다" added to "가지다")
나는 책 10권'이' 있다.
나는 책 10권'을' 소유하고 있다. (*notice the "있다" added to "소유하다")
Of all three, only 소유하다 has a Chinese origin(Kanji- if you will), thus can endure more formal settings, i.e. in legal documents in a trial, real estate transactions, customs claims, etc. So if you use "소유하다" for petty things that you own, it may sound too grand of an expression. But because of that seriousness in tone, "소유하다" is sometimes used to describe one's actions in personal relationships i.e., 너를 온전하게 소유하고 싶어. 나는 너의 소유물이 아니야, to express one's desire for exclusiveness in a relationship.
One thing of note when using "있다" to mean "to have": since it is an intransitive verb, there are certain limitations.
One example, when you directly express your wish to own something, you can either say
나는 포르셰를 가지고 싶어 (o) , or 나는 포르셰를 소유하고 싶어(o)
But you cannot say
나는 포르셰가 있고 싶어.