Cracher is not always negative. (Cracher sur qqch/qqn is always negative, it means “denigrate”.) In this context, it expresses reluctance to speak (not difficulty to speak). It's less strong than “she spat out the words”, closer to “forced out the words”.
Cracher is comprehensible but not necessarily what I would use in this sentence. In this sense, it's mainly used in the expression “cracher le morceau“, which means to reveal a secret (with no implication of negativity, e.g. you can use it to say someone revealed the nature of a surprise gift). To express reluctance to speak, you can use the expression “du bout des lèvres”, which implies a mumbled tone. Grammatically, this requires expressing what is said to some extent.
Elle finit par avouer du bout des lèvres qu'elle avait eu tort.
To express difficulty to speak, I would tend to use the generic word dire and qualify it with a complement. But there are many ways to say this, depending on the context and on the mood you want to set.
Rassemblant toutes ses forces, elle finit par dire quelques mots d'une voix haletante.