Thank you @andrew-lukasik for the answer!
I appreciate the example 
I ended up thinking about which architecture suits me best,
and I believe object oriented programming flows much better in my blood.
for future reference,
My solution was to create an Action object for any story action (walking, looking, talking)
public interface StoryCommand
{
public bool Execute();
}
and have an execute function inside it that is responsible for handling the request.
public class say : StoryCommand
{
string _text;
public say(string text)
{
_text = text;
}
public bool Execute()
{
Debug.Log(_text);
return true;
}
}
public class goTo : StoryCommand
{
Vector3 _targetPosition;
Transform _character;
readonly float _speed;
public goTo(Transform character, Vector3 position, float speed = 4f)
{
_character = character;
_targetPosition = position;
_speed = speed;
}
public bool Execute()
{
_character.position = Vector3.MoveTowards(_character.position, _targetPosition, Time.deltaTime * _speed);
if (Vector3.Distance(_character.position, _targetPosition) < 0.4f)
return true;
return false;
}
}
then I have a global manager (story executer) that when a chapter is started, it calls each function in the queue one after the other has finished.
if the execute() returns true I Dequeue to the next story action, if not I continue in the next frame with the current one.
public StoryCommand _currentAction;
public Queue<StoryCommand> _story = new Queue<StoryCommand>();
void Update()
{
if (--------- null checks)
return;
if (_currentAction.Execute())
{
if (_story.Count is 0)
{
finishedChapter?.Invoke(_currentChapter);
_currentChapter = Chapters.empty;
chapterStarted = false;
}
else
_currentAction = _story.Dequeue();
}
}
and inside the character script all I need to do is add a new action to the queue:
public void lookAt(Vector3 targetRotation)
{
_storyExecuter.addAction(new lookAt(transform, targetRotation));
}
and my main story script remains the same:
public void startStory()
{
Dictionary<Characters, StoryCharacter> storyCharacters = GameObject.FindObjectsOfType<StoryCharacter>().ToDictionary(sc => sc.characterStory.character);
StoryCharacter bigFoot = storyCharacters[Characters.Bigfoot];
storyExecuter.setChapter(Chapters.start);
bigFoot.Say("hey");
bigFoot.goTo(new Vector3(10, bigFoot.transform.position.y, 1));
bigFoot.Say("I think it worked!");
bigFoot.goTo(new Vector3(1, bigFoot.transform.position.y, 1));
Vector3 forwardTransform = bigFoot.transform.forward;
bigFoot.lookAt(new Vector3(forwardTransform.x, 20f, forwardTransform.z));
storyExecuter.startChapter();
}
I may want to add new actions to allow combination with TimeLine, and maybe in the future (if it won’t break too much) also involve data oriented actions if I will need.
would love to hear what you think,
so far this seems to be pretty solid, and hopefully will be flexible when the project grows bigger. 
Cheers!
Is this some kind of animation system? What is the purpose of this system? I ask because "story" is a very broad and unspecific term. So far this code looks to me like a state machine in the making and there are existing and proven FSM tools out there like Playmaker to do this (which works with Timeline already afaik).
– andrew-lukasikmy goal is to have a "cutscene" management system, where I can write different "in game movies" and easily control what is going on in the scene. PlayMaker looks interesting, I may get it in a future project
– yonatanab1