Yeah, that way didn't work for me either. Once you queue_free the script is destroyed also.
First of all you need to load your scene in an autoload or the main scene:
var axe = preload("res://axe.tscn")
This would be the item you want to drop and it's on the main scene script
Then you want a function that takes a Vector3 which is the translation of the enemy.
func add_axe(tran):
var instance = axe.instance()
add_child(instance)
instance.translation = tran
That's for 3d.
If it's 2d, you give it a position instead and set the position. I've never done it in 2d, but should be the same. So then before you queue_free, call that function on the main script and give it the position or translation of the enemy. I have instanced, but I haven't actually tried this but it should work.