You'll still be writing a mod, but take a look at my library.
viewtopic.php?f=51&t=16642
https://mods.factorio.com/mods/Bobingabout/boblibrary
The information is a little out of date, but instead of having to redefine entire recipes, or use the raw.data.recipe hard table edits, you can instead use lines like this
bobmods.lib.recipe.replace_ingredient(recipe, old, new) --(Performs a remove, then an add, keeping the same amount of the item)
bobmods.lib.recipe.add_new_ingredient(recipe, item) --(If the item exists already it is ignored)
bobmods.lib.recipe.add_ingredient(recipe, item) --(if the item exists, the number required is increased)
bobmods.lib.recipe.remove_ingredient(recipe, item)
bobmods.lib.recipe.add_result(recipe, item)
bobmods.lib.recipe.remove_result(recipe, item)
Then you get advanced versions for recipes with two definitions for expensive.
bobmods.lib.recipe.remove_difficulty_ingredient(recipe, difficulty, item)
bobmods.lib.recipe.add_new_difficulty_ingredient(recipe, difficulty, item)
bobmods.lib.recipe.add_difficulty_ingredient(recipe, difficulty, item)
bobmods.lib.recipe.add_difficulty_result(recipe, difficulty, item)
bobmods.lib.recipe.remove_difficulty_result(recipe, difficulty, item)
For all cases, recipe is the recipe's internal name and difficulty is the difficulty name. ("normal" or "expensive")
item is different between add and remove. Remove (and replace) is simply the item's internal name (fluids are accounted for), however when you add, you need to specify more information, so {"wood",1} or {type="fluid", name="water", amount = 1} are valid item tables (Just like normal LUA)
So a couple of literal examples:
bobmods.lib.recipe.replace_ingredient("bob-pump-2", "steel-plate", "aluminium-plate")
bobmods.lib.recipe.add_ingredient("bob-locomotive-2", {"steel-bearing", 16})
Unfortunately in it's current state, it doesn't do everything for a recipe, it doesn't change category, or crafting time. Since the primary reason for this existing was to help me, and changing a category is easy enough, you just do data.raw.recipe[recipe].category = new_category, crafting time is a little harder with the multiple difficulties though.
There is also another set of functions for manipulating Technologies, which include adding or removing a recipe as an unlock for that technology.
Do you think this is closer to what you want?